//
// Created by 11510 on 2024/6/7.
//

#include "String.h"
#include <string.h>
#include <iostream>
using std::cout;
using std::endl;

/**
 * 无参构造
 */
String::String():_pstr(new char[2]()){
//    初始化为空指针不安全
}

/**
 * 有参构造
 * @param rhs
 */
String::String(const char* rhs):_pstr(new char[strlen(rhs)+ 1]()){
    strcpy(_pstr, rhs);
//    cout << rhs << endl;
}

/**
 * 拷贝构造函数
 * @param rhs 对象引用
 */
String::String(const String& rhs)
    :_pstr(new char[strlen(rhs.c_str()) + 1]()){
    strcpy(_pstr, rhs.c_str());
}

/**
 * 重载赋值运算符
 * @param rhs
 * @return
 */
String& String::operator=(const String &rhs){
    if(&rhs != this){/*不可自复制*/
        /* 既然能赋值，说明这个对象已经构造出来了，所以直接delete */
        delete [] _pstr;
        _pstr = new char[strlen(rhs.c_str()) + 1]();
        strcpy(_pstr, rhs.c_str());
    }
    return *this;
}

/**
 * 析构函数
 */
String::~String(){
    if(_pstr != nullptr){
        delete [] _pstr;
        _pstr = nullptr;
    }
}


/**
 * 获得内部指针成员指向的地址
 * @return
 */
const char* String::c_str() const {
    return _pstr;
}

/**
 * 获得字符串长度
 * @return
 */
size_t String::length() const {
    return strlen(_pstr);
}

void String::print() {
    printf("%s\n", _pstr);
//    cout << _pstr << endl;
}